package top.hekun.study.asm;

import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

/**
 * 〈字节码 类访问器 〉
 *
 * @author: Sakura
 * @date: 2023/4/22
 */
public class MyClassVisitor extends ClassVisitor {
    public MyClassVisitor(int api, ClassVisitor classVisitor) {
        super(api, classVisitor);
    }


    /**
     * 访问该类的方法。此方法<i>每次被调用时都必须<i>返回一个新的｛@link MethodVisitor｝实例（或｛@literal null｝），即不应返回以前返回的访问者
     * @param access 方法的访问标志（请参阅{@link Opcodes}）。此参数还指示该方法是否是合成的和或不推荐使用。
     * @param name // 方法名称
     * @param desc 方法的描述符（请参见｛@link Type｝）。
     * @param signature 方法的签名。如果方法参数、返回类型和异常不使用泛型类型，则可能为
     * @param exceptions 方法的异常类的内部名称（请参见｛@link TypegetInternalName（）｝）。可能是｛@literal null｝。
     * @return
     */
    @Override
    public MethodVisitor visitMethod(int access, String name, String desc,
                                     String signature, String[] exceptions) {
        /**
         * 当读取到 getName 方法的时候 调用自定义程序
         */
        if (name.equals("getName")) {
            return new MyMethodVisitor(Opcodes.ASM9,access,desc, super.visitMethod(access, name, desc, signature, exceptions));
        }
        return super.visitMethod(access, name, desc, signature, exceptions);
    }


}


